package reflect;

import javax.lang.model.element.NestingKind;
import java.io.File;
import java.io.FileFilter;
import java.net.URISyntaxException;

/**
 * 实例化与当前类Test6在同一个包中的所有类
 */
public class Test6 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        /*
            思路:
            1:定位Test6.class文件所在的目录(该目录就是Test6所在的包)
            2:利用File的API可以获取该目录下的所有.class文件
            3:java命名规则要求:类名与它对应的字节码文件的名字一致
              好比Person类的字节码文件应当叫:Person.class
              因此我们通过每个class文件的文件名就能得知对应的类名
            4:利用Class.forName加载这个类
            5:通过类对象实例化
         */
        //1.获取当前类Test6的包名
        Class c = Test6.class;
        String pack = c.getPackage().getName();

        //2.定位Test6类的路径
        File position = new File(Test6.class.getResource(".").toURI());

        //3.获取该路径下的所有.class文件
        File[] subs = position.listFiles(f -> f.getName().endsWith(".class"));

        //4.通过对应的字节码文件的文件名获取对应的类型
        for (File sub : subs) {
            String filename = sub.getName();
            //String classname = filename.substring(0,filename.indexOf("."));
            String className = filename.replace(".class", "");
            System.out.println(className);
            //5.加载类对象
            Class cls = Class.forName(pack + "." + className);
            //6.实例化
            System.out.println("实例化:" + className);
            Object o = cls.newInstance();
            System.out.println(o);
        }
    }
}
